/*
 * PHY_SPWM.c
 *
 *  Created on: Jun 10,2024
 *      Author: Liangmiyi
 */

#include <MY_INC/PHY/PHY_SPWM.h>
/*
 * @brief 根据参考电压和直流母线电压生成SPWM波形，适用于交替模式
 * @param Vref 参考电压
 * @param Udc 直流母线电压
 * @param Period PWM周期
 * @param[out] Pulse_width_HRTIM 输出的PWM脉冲宽度数组
 */
void Single_Phase_Inverter_SPWM_Alternate(float Vref, uint32_t Pulse_width_HRTIM[2])
{

	    	float PhaseA_temp = (Vref * (float)PWM_PERIOD);    // 计算初始PWM脉冲宽度
	    	float PhaseB_temp = PhaseA_temp + PWM_PERIOD;        // 计算相位N的PWM脉冲宽度
	        // 限制相位L的PWM脉冲宽度在有效范围内
	        PhaseA_temp = (PhaseA_temp > U_LIMIT_HIGH) ? U_LIMIT_HIGH : PhaseA_temp;
	        PhaseA_temp = (PhaseA_temp < U_LIMIT_ZERO) ? 0 : PhaseA_temp;
	        PhaseB_temp = (PhaseB_temp > PWM_PERIOD) ? PWM_PERIOD : PhaseB_temp;
	        PhaseB_temp = (PhaseB_temp < U_LIMIT_LOW) ? U_LIMIT_LOW : PhaseB_temp;
	        // 赋值输出PWM脉冲宽度
	        Pulse_width_HRTIM[0] = (int32_t)PhaseA_temp;
	        Pulse_width_HRTIM[1] = PWM_PERIOD - (int32_t)PhaseB_temp;
}

/*
 * @brief 根据参考电压和直流母线电压生成SPWM波形，适用于交替模式
 * @param Vref 参考电压
 * @param Udc 直流母线电压
 * @param Period PWM周期
 * @param[out] Pulse_width_HRTIM 输出的PWM脉冲宽度数组
 */
void Single_Phase_Inverter_SPWM_FreqDouble(float Vref, float Udc, const uint32_t Period, uint32_t Pulse_width_HRTIM[2])
{
    // 计算初始PWM脉冲宽度
    int32_t Vref_temp = (int32_t)((Vref / Udc + 1.0f) * (float)(Period >> 1));
    // 计算相位L的PWM脉冲宽度
    int32_t PhaseA_temp = Vref_temp;
    // 计算相位N的PWM脉冲宽度
    int32_t PhaseB_temp = Period - Vref_temp;

    // 限制相位L的PWM脉冲宽度在有效范围内
    if (PhaseA_temp > (U_LIMIT_HIGH))
    {
        PhaseA_temp = U_LIMIT_HIGH; // 限制最大值
    }
    else if (PhaseA_temp < U_LIMIT_ZERO)
    {
        PhaseA_temp = 0; // 限制最小值
    }
    // 限制相位N的PWM脉冲宽度在有效范围内
    if (PhaseB_temp > (U_LIMIT_HIGH))
    {
        PhaseB_temp = U_LIMIT_HIGH; // 限制最大值
    }
    else if (PhaseB_temp < U_LIMIT_ZERO)
    {
        PhaseB_temp = 0; // 限制最小值
    }
    // 赋值输出PWM脉冲宽度
    Pulse_width_HRTIM[0] = PhaseA_temp;
    Pulse_width_HRTIM[1] = PhaseB_temp;
}
